package com.example.tilas1.pojo.response;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

/**
 * @author byzhao
 * @created 2024-03-29 14:59:55
 * @describtion 统一结果响应类
 * <p>
 * 后端提供给前端接口 多种多样，每一个接口都会有自己要携带的数据。如果每一个接口都按照自己方式数据返回，
 * 整个接口杂乱无章，维护起来存在诸多问题。为了解决这中问题 ，引入统一结果响应！
 * <p>
 * 统一结果响应类：
 * <p>
 * ① 响应码 ：告知前端本次请求是否成功 比如 0 成功  1失败
 * ② 描述 ： 对我们状态码进行进一步解释
 * ③ 数据 ： 本次请求携带的数据，确定? 不确定类型东西可以使用泛型！
 *
 *   Result 返回的时候 springboot 会将他转化json
 *
 *   如果Result 中data 属性 为null 一般不显示的 ，需要借助一个注解
 *   @JsonInclude jackson（springboot御用json处理工具） 提供 。
 *   可以实现空属性不再生成的json中！ 指定属性 value = JsonInclude.Include.NON_NULL
 *
 *
 */
@Data
@JsonInclude(value = JsonInclude.Include.NON_NULL)
public class Result<T> {
    /**
     * 响应码：规定 1 成功， 0 或其他 失败
     */
    private Integer code;
    /**
     * 响应码描述，信息描述
     */
    private String msg;
    /**
     * 数据
     */
    private T data;

    /**
     * 构造私有化，此类不允许外部new 创建
     *
     * @param code 接口
     * @param data 数据
     */
    private Result(Code code, T data) {
        this.code = code.getCode();
        this.msg = code.getMsg();
        this.data = data;
    }

    //// 为了方便别人在外部使用，提供多个静态方法返回当前类的对象

    /**
     * 请求成功 而且返回数据
     *
     * @param data 携带数据
     * @param <T>  数据类型
     * @return Result
     */
    public static <T> Result<T> success(T data) {
        return new <T>Result<T>(CommonCodeEnum.SUCCESS, data);
    }

    /**
     * 请求成功 不反回数据
     *
     * @return Result
     */
    public static <T> Result<T> success() {
        return new <T>Result<T>(CommonCodeEnum.SUCCESS, null);
    }

    /**
     * 请求失败
     *
     * @return Result
     */
    public static <T> Result<T> error() {
        return new <T>Result<T>(CommonCodeEnum.ERROR, null);
    }


}
